昨天我們學到 |
和 select()
,今天來認識常用的條件式吧~
師傅:好,看來你已經準備好迎接更大的挑戰了。讓我們來談談 jq filter 中的條件式。
徒弟:條件式?是不是像我們之前用的 select?
師傅:沒錯,select() 是一個內建函式,它接受一個條件式或布林值作為參數。條件式就是運算結果為布林值的運算式,條件式中一般都會使用比較運算子。我們來看看一些常見用於條件式的比較運算子:
==
!=
>
<
>=
<=
and
or
not
徒弟:哇!這些看起來很強大啊!我可以試試嗎?
師傅:當然可以。試著從 TODO 陣列中,找出 id 大於 150 且未完成的 TODO。
徒弟:讓我想想...是這樣嗎?jq ".[] | select(.id > 150 and .completed == false) | .title" todos.json
師傅:做得好。你的理解很準確。
徒弟:謝謝師傅!我感覺自己對 jq 的理解又深入了一層。
師傅:很好。記住,實踐出真知。多嘗試不同的組合,你會發現更多有趣的用法。
徒弟:是的,師傅!我會努力練習的!
==
jq 條件式會使用到的比較運算子大部分都很直觀通用,比較要注意的反而是 ==
等於這個比較的寫法。
如果 a 和 b 在 JSON 定義中的型別與值皆相等,那麼 a==b
這個條件是運算的結果是 true
。如果是 javascript 的開發者應該會知道,這樣的條件式在 javascript 裡面是 a===b
;也就是說 jq 運算式當中的 a==b
等同於 javascript 中的 a===b
。
拆解這段條件式如下:
id > 150
and
.completed == false
最後再將這段條件是當作 select()
函式的輸入參數,滿足這個條件的物件才會輸出,成為 .title
這段 filter 的輸入值,藉此條件篩選出想要的結果。
jq ".[] | select(.id > 150 and .completed == false) | .title" todos.json
今天認識了 jq filter 條件式中常用的判斷運算子,在我學習之前,從沒有想過這麼常見的判斷用法也可以寫在 jq filter 裡面,搭配輸入陣列 iterator 和 |
,既簡潔又快速地達成篩選資料的效果。感謝今天自己也認真的學習~學而時習之,不亦悅乎。